【CS61B】Lec9-Subtype Polymorphism, Comparators, Comparables, Generic Functions

  • ~1.69K 字
  1. 1. Lec9-Subtype Polymorphism, Comparators, Comparables, Generic Functions
    1. 1.1. Subtype Polymorphism
    2. 1.2. Comparator
    3. 1.3. 泛型函数

Lec9-Subtype Polymorphism, Comparators, Comparables, Generic Functions

Subtype Polymorphism

Java中没有重载运算符,故我们需要使用Comparable接口来实现类似功能

Java源码中对该接口的描述如下:

我们需要实现该接口

e.g. 定义Dog类,通过size属性比较两只狗的大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package Lec9;

public class Dog implements Comparable<Dog>{
public String name;
public int size;
public Dog(String n, int s){
name = n;
size = s;
}
@Override
public int compareTo(Dog o) {
if (size < o.size){
return -1;
}
else if (size > o.size){
return 1;
}
return 0;
}
}

另一种写法

java规定了若更小则返回负数

1
2
3
4
@Override
public int compareTo(Dog o) {
return size - o.size;
}

这种操作被称为子类型多态

  • 超类指定了可以干什么(如Comparable接口指定了比较功能)
  • 子类通过重写超类的抽象方法,来使java根据调用方法的对象来决定运行时该做什么

Comparator

Java提供了接口Comparator用来比较其他对象

语法:

1
2
3
4
public interface Comparator<T>{
int compare(T o1, T o2);
...
}

Dog类中

1
2
3
4
5
6
7
public static class NameComparator implements Comparator<Dog> {

@Override
public int compare(Dog a, Dog b) {
return a.name.compareTo(b.name);
}
}

其中Dog.NameComparator()的数据类型为Comparator<Dog>

更现代的方式是使用lambda表达式定义comparator

1
2
Comparator<Dog> dc =(d1, d2) -> d1.name.compareTo(d2.name);
Dog maxNameDog = Collection.max(dogs,dc);

泛型函数

如何编写自己的方法

e.g. 实现一个方法,从数组中随机选择一个元素,并且接受各种类型

在这里,选择随机元素的方法是静态的,正确方式是让方法本身变为泛型,而非让类变为泛型

即声明了一个公共静态函数,用于处理类型T的对象

因为如果让整个类泛型化,你需要实例化那个类来获得泛型行为,但把该方法作为一个静态方法来看,并不需要实例化

1
2
3
4
5
6
7
publicc class RandomPicker{
public static <T> T pickRandom(T[] x){
Random random = new Random();
int randomIndex = random.nextInt(x.length);
return x[randomIndex];
}
}
赞助喵
非常感谢您的喜欢!
赞助喵